import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Line, Grid
import os

# 确保目标目录存在
file_path = '../data/20250527爱奇艺风云榜电影榜res.xlsx'
directory_data = os.path.dirname(file_path)

if not os.path.exists(directory_data):
    os.makedirs(directory_data)

# 确保图片存储目录存在
pic_path = '../pic/爱奇艺风云榜电影热度Top20折线图.html'
directory_pic = os.path.dirname(pic_path)

if not os.path.exists(directory_pic):
    os.makedirs(directory_pic)

# 读取Excel文件
df = pd.read_excel(file_path)

# 处理弹幕数量数值
def convert_danmu(x):
    if pd.isna(x):
        return 0  # 或者你认为合适的默认值
    x = str(x)  # 确保x是字符串
    x = x.replace('条弹幕', '')
    x = x.replace('超', '')  # 处理“超10”这种情况
    if '万' in x:
        return int(float(x.replace('万', '')) * 10000)
    else:
        # 确保在转换为整数之前，字符串是数字
        if x.replace('.', '', 1).isdigit():
            return int(float(x))
        else:
            return 0  # 或者你认为合适的默认值

df['弹幕'] = df['弹幕'].map(convert_danmu)

# 标签整理
df['标签'] = df['标签'].fillna('')  # 确保标签列没有NaN值
df[['年份', '类型', '主演']] = df['标签'].str.split(' / ', expand=True)

# 处理类型列
def split_types(x):
    if pd.isna(x):
        return pd.Series([None, None])
    x = x.lstrip(' ').rstrip(' ')
    parts = x.split(' ', 1)
    if len(parts) == 2:
        return pd.Series([parts[0], parts[1]])
    else:
        return pd.Series([parts[0], None])

df[['类型1', '类型2']] = df['类型'].apply(split_types)

# 导出Excel文件
df.to_excel(file_path, index=False)

print(f"数据已成功写入 {file_path}")

# 处理热度和剧名数据
hot = df['热度'].fillna(0).astype('int')  # 处理热度中的NaN值
name = df['剧名'].astype('str')  # 各电影名称统计

# 获取Top20数据
top_20 = df.nlargest(20, '热度')
y_data = top_20['热度'].tolist()
x_data = top_20['剧名'].tolist()

# 创建折线图
line_ensur = (
    Line()
    .add_xaxis(x_data)  # 添加横轴
    .add_yaxis(
        series_name='热度',
        y_axis=y_data,
        label_opts=opts.LabelOpts(is_show=False),
        color='#4b0101',
        linestyle_opts=opts.LineStyleOpts(
            width=1.2,
        ),
    )
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(
            type_="category",
            axislabel_opts={"rotate": 20},
        ),
        yaxis_opts=opts.AxisOpts(
            name='热度',
            min_=2500,  # 设置Y轴最小值
        ),
        title_opts=opts.TitleOpts(
            title='爱奇艺风云榜电影热度Top20折线图',  # 标题
            subtitle='数据来源：爱奇艺风云榜',
            pos_left='center',  # 标题位置
            pos_top='3%',
        ),
        # 图例设置
        legend_opts=opts.LegendOpts(
            pos_top='10%',  # 图例位置
            pos_left='center',
        ),
        # 提示框
        tooltip_opts=opts.TooltipOpts(
            trigger='axis',  # 'axis': 坐标轴触发，主要在柱状图，折线图等会使用类目轴的图表中使用
            axis_pointer_type='cross',  # 'cross'：十字准星指示器。其实是种简写，表示启用两个正交的轴的 axisPointer。
        ),
    )
    .set_series_opts(
        label_opts=opts.LabelOpts(
            is_show=True,
            interval=0
        ),  # 显示标签
    )
)

# 创建画布
grid = Grid(
    init_opts=opts.InitOpts(
        width="1500px",  # 图的大小
        height='750px'
    )
)

# 添加折线图到画布并渲染
grid.add(
    line_ensur,
    grid_opts=opts.GridOpts(pos_top="13%", pos_bottom="10%")
).render(pic_path)

print(f"折线图已成功生成 {pic_path}")
